裝飾器是一種設計模式,允許用戶在不修改原始函式的結構下,為其添加新功能。
如果要使用裝飾器的話,通常是在我們想要使用裝飾器的某個函式的**「定義之前」**放置使用。
要創建裝飾器函式,我們需要一個外部函式和一個內部包裝函式。
範例:
# 普通函式
def greeting():
return 'Welcome to Python'
def uppercase_decorator(function):
def wrapper():
func = function()
make_uppercase = func.upper()
return make_uppercase
return wrapper
g = uppercase_decorator(greeting)
print(g()) # WELCOME TO PYTHON
我們也可以用裝飾器來裝飾函式,讓程式更加簡潔。
# 使用裝飾器來裝飾函式
def uppercase_decorator(function):
def wrapper():
func = function()
make_uppercase = func.upper()
return make_uppercase
return wrapper
@uppercase_decorator
def greeting():
return 'Welcome to Python'
print(greeting()) # WELCOME TO PYTHON
我也可以對一個函式使用多個裝飾器,這樣一個函式可增加多個附加功能。
# 第一個裝飾器
def uppercase_decorator(function):
def wrapper():
func = function()
make_uppercase = func.upper()
return make_uppercase
return wrapper
# 第二個裝飾器
def split_string_decorator(function):
def wrapper():
func = function()
splitted_string = func.split()
return splitted_string
return wrapper
@split_string_decorator
@uppercase_decorator
def greeting():
return 'Welcome to Python'
print(greeting()) # ['WELCOME', 'TO', 'PYTHON']
這邊要特別注意的是,裝飾器的執行順序很重要,所以如果調動@split_string_decorator
跟 @uppercase_decorator
的先後順序,也會造成不同的結果,以上述的例子而言,會先將字串轉為大寫,接著將其切分成串列。
有一種情況是我們需要函式接受參數,因此我們可能需要定義一個能夠接受參數的裝飾器。
def decorator_with_parameters(function):
def wrapper_accepting_parameters(para1, para2, para3):
function(para1, para2, para3)
print("I live in {}".format(para3))
return wrapper_accepting_parameters
@decorator_with_parameters
def print_full_name(first_name, last_name, country):
print("I am {} {}. I love to teach.".format(first_name, last_name, country))
print_full_name("Chien", "Chuan", "Taiwan")
上面的程式碼執行完的結果會先印出 I am Chien Chuan. I love to teach.
,接著再印出 I live in Taiwan
。